import tkinter as tk
from tkinter import ttk, messagebox, Menu
import ttkbootstrap as ttkb
from ttkbootstrap.constants import *
from ui_components.project_panel import ProjectPanel
from ui_components.task_panel import TaskPanel
from ui_components.gantt_panel import GanttPanel
from ui_components.stat_panel import StatPanel
from data_manager.db_handler import init_db, get_current_project
from utils.log_handler import logger
from utils.shortcut_handler import bind_shortcuts

# 日志系统已通过LogManager单例初始化（Windows 路径已适配）

# 检查依赖（首次运行提示安装）
try:
    import openpyxl, pandas, reportlab, matplotlib, colorlog
except ImportError as e:
    missing_pkg = str(e).split("'")[1]
    messagebox.showerror(
        "依赖缺失", 
        f"请先安装缺失的依赖包：\npip install {missing_pkg} ttkbootstrap openpyxl pandas reportlab matplotlib colorlog",
        parent=None
    )
    exit()

class EnterpriseGanttApp(ttkb.Window):
    def __init__(self):
        super().__init__(title="企业级项目甘特图管理系统", themename="superhero")  # Windows 适配主题
        self.geometry("1600x900")
        self.minsize(1200, 700)
        self.current_project_id = None  # 当前激活项目ID（整数类型，避免匹配错误）
        self.task_cache = []  # 任务缓存（减少数据库查询）
        
        # 1. 初始化数据库（Windows 路径下自动创建）
        init_db()
        logger.info("系统启动：数据库初始化完成（路径：gantt_project.db）")
        
        # 2. 构建主布局（PanedWindow 可拖拽，适配 Windows 分辨率）
        self._build_main_layout()
        
        # 3. 绑定快捷键（Windows 兼容：Ctrl/Alt/Del）
        bind_shortcuts(self)
        
        # 4. 构建菜单（企业级导航，适配 Windows 菜单风格）
        self._build_menu()
        
        # 5. 加载默认项目（无项目时引导创建）
        self._load_default_project()
        
        # 6. 窗口关闭事件（数据保存校验）
        self.protocol("WM_DELETE_WINDOW", self._on_close)

    def _build_main_layout(self):
        """外层水平分割（左35%+右65%），内层垂直分割"""
        self.horizontal_pane = ttkb.PanedWindow(self, orient=HORIZONTAL)
        self.horizontal_pane.pack(fill=BOTH, expand=YES, padx=8, pady=8)
        
        # 左侧：项目面板（25%）+ 任务面板（75%）
        self.left_vertical_pane = ttkb.PanedWindow(self.horizontal_pane, orient=VERTICAL)
        self.horizontal_pane.add(self.left_vertical_pane, weight=35)
        
        # 右侧：甘特图（70%）+ 统计面板（30%）
        self.right_vertical_pane = ttkb.PanedWindow(self.horizontal_pane, orient=VERTICAL)
        self.horizontal_pane.add(self.right_vertical_pane, weight=65)
        
        # 加载组件（传递回调函数，避免循环导入）
        self.project_panel = ProjectPanel(self.left_vertical_pane, self._on_project_change)
        self.left_vertical_pane.add(self.project_panel, weight=25)
        
        self.task_panel = TaskPanel(self.left_vertical_pane, self._on_task_operate)
        self.left_vertical_pane.add(self.task_panel, weight=75)
        
        self.gantt_panel = GanttPanel(self.right_vertical_pane)
        self.right_vertical_pane.add(self.gantt_panel, weight=70)
        
        self.stat_panel = StatPanel(self.right_vertical_pane)
        self.right_vertical_pane.add(self.stat_panel, weight=30)

    def _build_menu(self):
        """Windows 风格菜单：文件/编辑/视图/工具/帮助"""
        self.menu_bar = Menu(self)
        
        # 文件菜单（新建/导入/导出/退出）
        file_menu = Menu(self.menu_bar, tearoff=0)
        file_menu.add_command(label="新建项目", command=self.project_panel.create_project, accelerator="Ctrl+N")
        file_menu.add_command(label="导入JSON", command=self._import_json, accelerator="Ctrl+I")
        file_menu.add_command(label="导出Excel", command=self._export_excel, accelerator="Ctrl+E")
        file_menu.add_command(label="导出PDF", command=self._export_pdf, accelerator="Ctrl+P")
        file_menu.add_separator()
        file_menu.add_command(label="退出", command=self._on_close, accelerator="Alt+F4")  # Windows 退出快捷键
        self.menu_bar.add_cascade(label="文件", menu=file_menu)
        
        # 编辑菜单（任务操作）
        edit_menu = Menu(self.menu_bar, tearoff=0)
        edit_menu.add_command(label="新建任务", command=self.task_panel.create_task, accelerator="Ctrl+T")
        edit_menu.add_command(label="批量修改", command=self.task_panel.batch_edit_task, accelerator="Ctrl+B")
        edit_menu.add_command(label="删除选中", command=self.task_panel.delete_selected_tasks, accelerator="Del")  # Windows Del键
        self.menu_bar.add_cascade(label="编辑", menu=edit_menu)
        
        # 视图菜单（主题/网格/缩放）
        view_menu = Menu(self.menu_bar, tearoff=0)
        view_menu.add_command(label="切换主题", command=self._switch_theme)
        view_menu.add_command(label="显示网格线", command=self.gantt_panel.toggle_grid, accelerator="Ctrl+G")
        view_menu.add_command(label="放大甘特图", command=self.gantt_panel.zoom_in, accelerator="Ctrl++")
        view_menu.add_command(label="缩小甘特图", command=self.gantt_panel.zoom_out, accelerator="Ctrl+-")
        self.menu_bar.add_cascade(label="视图", menu=view_menu)
        
        # 帮助菜单（文档/反馈/关于）
        help_menu = Menu(self.menu_bar, tearoff=0)
        help_menu.add_command(label="使用文档", command=self._open_doc)
        help_menu.add_command(label="提交反馈", command=self._open_feedback)
        help_menu.add_separator()
        help_menu.add_command(label="关于系统", command=self._show_about)
        self.menu_bar.add_cascade(label="帮助", menu=help_menu)
        
        self.config(menu=self.menu_bar)

    def _load_default_project(self):
        """加载默认项目（避免 StopIteration：先判断是否有项目）"""
        default_project = get_current_project()
        if default_project:
            self.current_project_id = default_project[0]  # ID 为整数
            self.project_panel.load_projects(active_project_id=self.current_project_id)
            self._refresh_all_panels()
            logger.info(f"加载默认项目：{default_project[1]}（ID：{self.current_project_id}）")
        else:
            messagebox.showinfo("首次使用", "未检测到项目，请先创建第一个项目", parent=self)
            self.project_panel.create_project()

    def _on_project_change(self, project_id, project_name):
        """项目切换回调：更新所有面板（确保 ID 为整数）"""
        self.current_project_id = int(project_id)  # 强制转整数，避免类型不匹配
        self.title(f"企业级项目甘特图管理系统 - {project_name}")
        self._refresh_all_panels()
        logger.info(f"项目切换：{project_name}（ID：{project_id}）")

    def _on_task_operate(self, operate_type, task_data=None):
        """任务操作回调（新增/编辑/删除后刷新）"""
        self._refresh_all_panels()
        op_map = {"create": "创建", "edit": "编辑", "delete": "删除", "batch_edit": "批量修改"}
        logger.info(f"任务{op_map.get(operate_type, '操作')}：{task_data['task_name'] if (task_data and 'task_name' in task_data) else '批量操作'}")

    def _refresh_all_panels(self):
        """统一刷新所有面板（避免重复查库）"""
        if not self.current_project_id:
            return
        # 1. 刷新任务面板并缓存任务
        self.task_cache = self.task_panel.load_tasks(self.current_project_id)
        # 2. 刷新甘特图（传递缓存）
        self.gantt_panel.update_gantt(self.task_cache)
        # 3. 刷新统计面板
        self.stat_panel.update_stat(self.task_cache)

    # ---------------------- 菜单功能实现（Windows 路径适配） ----------------------
    def _import_json(self):
        if not self.current_project_id:
            messagebox.showwarning("操作提示", "请先选择一个项目", parent=self)
            return
        self.task_panel.import_json(self.current_project_id)

    def _export_excel(self):
        if not self.task_cache:
            messagebox.showwarning("操作提示", "当前项目无任务数据", parent=self)
            return
        from utils.export_handler import export_tasks_to_excel
        export_tasks_to_excel(self.task_cache, self.current_project_id)

    def _export_pdf(self):
        if not self.task_cache:
            messagebox.showwarning("操作提示", "当前项目无任务数据", parent=self)
            return
        from utils.export_handler import export_project_report
        export_project_report(
            project_id=self.current_project_id,
            gantt_fig=self.gantt_panel.fig,
            stat_pie_fig=self.stat_panel.pie_fig,
            stat_line_fig=self.stat_panel.line_fig
        )

    def _switch_theme(self):
        """切换 Windows 兼容主题"""
        themes = ["superhero", "darkly", "flatly", "cosmo", "lumen"]
        current_theme = self.style.theme_use()
        next_idx = (themes.index(current_theme) + 1) % len(themes)
        self.style.theme_use(themes[next_idx])
        messagebox.showinfo("主题切换", f"已切换至「{themes[next_idx]}」主题", parent=self)

    def _open_doc(self):
        """Windows 打开文档（用默认浏览器）"""
        import webbrowser
        webbrowser.open("https://docs.enterprise-gantt.com/usage")  # 替换为实际文档地址

    def _open_feedback(self):
        messagebox.showinfo("反馈渠道", "请发送邮件至 support@gantt-system.com", parent=self)

    def _show_about(self):
        about_info = """
企业级项目甘特图管理系统 v2.1.0（Windows 适配版）
--------------------------------
功能特性：
- 多项目管理 + 任务精细化控制
- 拖拽式甘特图 + 依赖关系管理
- Excel/PDF导出 + 数据统计分析
- 快捷键操作 + 主题切换

技术支持：support@gantt-system.com
版权所有：Enterprise Solutions 2024
        """
        messagebox.showinfo("关于系统", about_info, parent=self)

    def _on_close(self):
        """Windows 关闭校验：未保存编辑提醒"""
        if hasattr(self.task_panel, "is_editing") and self.task_panel.is_editing:
            if messagebox.askyesno("确认关闭", "存在未保存的任务编辑，是否继续关闭？", parent=self):
                self.destroy()
                logger.info("系统关闭：用户确认放弃未保存编辑")
            return
        self.destroy()
        logger.info("系统正常关闭（Windows 环境）")

if __name__ == "__main__":
    app = EnterpriseGanttApp()
    app.mainloop()
